package org.xx.armory.commons;

import java.util.Formattable;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.xx.armory.commons.Validators.notNull;

/**
 * 使用映射函数进行格式化的工具类。
 *
 * @author Haart
 */
public class MapFormatter {
    static final Pattern PLACEHOLDER = Pattern
            .compile("\\$\\{([a-zA-Z0-9_\\- ]+)}", Pattern.DOTALL);

    /**
     * 禁止构造{@code MapFormatter}的实例。
     */
    private MapFormatter() {
    }

    /**
     * 使用指定的格式化字符串和映射函数进行格式化。
     *
     * @param fmt
     *         格式化字符串。
     * @param mappingFunction
     *         映射函数。
     * @return 格式化结果。
     * @throws NullPointerException
     *         如果参数{@code mappingFunction}是{@code null}。
     */
    public static String format(
            final String fmt,
            final Function<String, Object> mappingFunction
    ) {
        if (fmt == null) {
            return "";
        }

        if (isBlank(fmt)) {
            return fmt;
        }

        notNull(mappingFunction, "mappingFunction");

        final Matcher m = PLACEHOLDER.matcher(fmt);
        final StringBuilder ret = new StringBuilder();
        int regionStart = 0;
        while (m.find()) {
            ret.append(fmt.substring(regionStart, m.start()));
            final String key = m.group(1).trim();
            final Object value = mappingFunction.apply(key);
            if (value == null) {
                //
            } else if (value instanceof Formattable) {
                // TODO: 支持Formattable
                ret.append(value.toString());
            } else {
                ret.append(value.toString());
            }
            regionStart = m.end();
        }
        ret.append(fmt.substring(regionStart));

        return ret.toString();
    }
}
